মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর C++11 থেকে চালু করা হয়, যা ডাটা মেম্বারগুলোর রিসোর্স বা মেমোরি স্থানান্তর করতে সহায়ক। এটি মূলত রিসোর্স ইনটেনসিভ অবজেক্ট (যেমন, বড় অ্যারে বা ডাইনামিক মেমোরি) ব্যবহারের ক্ষেত্রে কাজকে দ্রুততর করে। সাধারণত, মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর এমন ক্লাসের জন্য প্রয়োজন হয়, যা ডাইনামিক মেমোরি ব্যবহারের মাধ্যমে কাজ করে।
C++ এ সাধারণত অবজেক্ট কপি করার সময় কপি কনস্ট্রাক্টর এবং কপি অ্যাসাইনমেন্ট অপারেটর ব্যবহৃত হয়। কিন্তু কপি করার ক্ষেত্রে সম্পূর্ণ ডেটা কপি করতে হয়, যা সময়সাপেক্ষ এবং মেমোরি ইনটেনসিভ হতে পারে। মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর এই সমস্যার সমাধান করে, কারণ তারা কপি না করে ডেটার মালিকানা (ownership) স্থানান্তর করে।
মুভ কনস্ট্রাক্টর ব্যবহার করে একটি অবজেক্ট তৈরি করা হলে, এটি মূল অবজেক্টের ডেটার মালিকানা নিয়ে নেয় এবং মূল অবজেক্টটিকে null বা nullptr
করে দেয়। ফলে ডেটা স্থানান্তর সহজ এবং দ্রুত হয়।
ClassName(ClassName&& other);
ClassName&&
হলো রাইট ভ্যালু রেফারেন্স (rvalue reference
), যা মুভ অপারেশন সমর্থন করে।#include <iostream>
#include <utility> // std::move এর জন্য
using namespace std;
class MyClass {
int* data;
public:
// কনস্ট্রাক্টর
MyClass(int value) {
data = new int(value);
cout << "Constructor called!" << endl;
}
// মুভ কনস্ট্রাক্টর
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr; // মূল অবজেক্টটিকে null করে দেওয়া
cout << "Move Constructor called!" << endl;
}
// ডেস্ট্রাক্টর
~MyClass() {
delete data;
cout << "Destructor called!" << endl;
}
int getValue() const {
return *data;
}
};
int main() {
MyClass obj1(42); // সাধারণ কনস্ট্রাক্টর কল
MyClass obj2 = std::move(obj1); // মুভ কনস্ট্রাক্টর কল
cout << "Value of obj2: " << obj2.getValue() << endl; // Output: Value of obj2: 42
return 0;
}
বর্ণনা:
MyClass(MyClass&& other)
হলো মুভ কনস্ট্রাক্টর, যা obj1
থেকে obj2
তে ডেটার মালিকানা সরিয়ে নেয়।std::move(obj1)
ব্যবহার করে obj1
থেকে মালিকানা obj2
তে স্থানান্তর করা হয়েছে।obj1
এর data
পয়েন্টার nullptr
হয়ে যায় এবং অবশেষে যখন obj1
ডেস্ট্রয় হয়, তখন ডেটা ডিলিট হবে না, কারণ এর মালিকানা ইতিমধ্যে obj2
এর কাছে চলে গেছে।মুভ অ্যাসাইনমেন্ট অপারেটর মুভ কনস্ট্রাক্টরের মতোই কাজ করে, তবে এটি ইতোমধ্যে বিদ্যমান অবজেক্টকে অন্য অবজেক্টের মালিকানা প্রদান করে।
ClassName& operator=(ClassName&& other);
#include <iostream>
#include <utility>
using namespace std;
class MyClass {
int* data;
public:
// কনস্ট্রাক্টর
MyClass(int value) {
data = new int(value);
cout << "Constructor called!" << endl;
}
// মুভ কনস্ট্রাক্টর
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr;
cout << "Move Constructor called!" << endl;
}
// মুভ অ্যাসাইনমেন্ট অপারেটর
MyClass& operator=(MyClass&& other) noexcept {
if (this != &other) { // সেলফ-অ্যাসাইনমেন্ট চেক
delete data; // পুরানো ডেটা মুক্ত করা
data = other.data;
other.data = nullptr;
cout << "Move Assignment called!" << endl;
}
return *this;
}
// ডেস্ট্রাক্টর
~MyClass() {
delete data;
cout << "Destructor called!" << endl;
}
int getValue() const {
return *data;
}
};
int main() {
MyClass obj1(42);
MyClass obj2(100);
obj2 = std::move(obj1); // মুভ অ্যাসাইনমেন্ট অপারেটর কল
cout << "Value of obj2: " << obj2.getValue() << endl; // Output: Value of obj2: 42
return 0;
}
বর্ণনা:
operator=(MyClass&& other)
মুভ অ্যাসাইনমেন্ট অপারেটর, যা obj1
থেকে obj2
এ ডেটার মালিকানা স্থানান্তর করে।delete data;
দিয়ে পূর্ববর্তী ডেটা ডিলিট করে নতুন মালিকানা obj1
থেকে স্থানান্তর করা হয়েছে।দ্রুত কার্য সম্পাদন: ডেটা কপি না করে সরাসরি মালিকানা স্থানান্তরের মাধ্যমে অপারেশন দ্রুত সম্পন্ন হয়।
মেমোরি সাশ্রয়: কপি করার চেয়ে মালিকানা স্থানান্তর কম মেমোরি ব্যবহার করে, বিশেষত বড় অবজেক্টের ক্ষেত্রে।
রিসোর্স ম্যানেজমেন্ট উন্নত করা: মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর রিসোর্স ইনটেনসিভ অবজেক্ট ম্যানেজমেন্টে কার্যকর ভূমিকা রাখে।
রাইট ভ্যালু রেফারেন্স: মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটরে রাইট ভ্যালু রেফারেন্স (&&
) ব্যবহার করতে হবে।
null বা nullptr: মুভের পরে, মূল অবজেক্টের ডেটা পয়েন্টার nullptr
এ সেট করা উচিত, যেন ডাবল ডিলিট এড়ানো যায়।
সেলফ-অ্যাসাইনমেন্ট চেক: মুভ অ্যাসাইনমেন্ট অপারেটরের ক্ষেত্রে সেলফ-অ্যাসাইনমেন্ট চেক করা গুরুত্বপূর্ণ, যাতে একই অবজেক্টে মুভ করে ডেটা ডিলিট না হয়ে যায়।
মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর রিসোর্স ইনটেনসিভ কাজগুলোর জন্য অত্যন্ত কার্যকর, কারণ এটি প্রোগ্রামকে আরও কার্যকর ও দ্রুততর করে তোলে।
common.read_more